﻿#region License

// Copyright (c) 2011, Matt Holmes
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification, are permitted provided 
// that the following conditions are met:
// 
// * Redistributions of source code must retain the above copyright notice, this list of conditions and the 
//   following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
//   the following disclaimer in the documentation and/or other materials provided with the distribution.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
// OF THE POSSIBILITY OF SUCH DAMAGE.

#endregion

using System;
using System.Reflection;
using System.Windows;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.UnityExtensions;
using Microsoft.Practices.ServiceLocation;
using Microsoft.Practices.Unity;
using SkyrimTweaker.Common;
using SkyrimTweaker.Common.Services;
using SkyrimTweaker.Properties;

namespace SkyrimTweaker {
	public class Bootstrapper : UnityBootstrapper {
		#region Fields

		private UnityServiceLocator _locator;

		#endregion

		#region Protected Methods

		protected override void ConfigureContainer () {
			base.ConfigureContainer ();

			var manager = Container.Resolve<IModuleManager> ();
			manager.LoadModuleCompleted += OnModuleLoaded;

			ServiceManager.Initialize (Container);
		}

		protected override IUnityContainer CreateContainer () {
			var container = base.CreateContainer ();
			_locator = new UnityServiceLocator (container);
			ServiceLocator.SetLocatorProvider (() => _locator);

			return container;
		}

		protected override IModuleCatalog CreateModuleCatalog () {
			ThemeManager.CacheThemeInfo (Assembly.GetEntryAssembly ());
			return new ConfigurationModuleCatalog ();
		}

		protected override DependencyObject CreateShell () {
			Container.RegisterType<IUpdateProgressViewModel, UpdateProgressViewModel> ();
			Container.RegisterType<UpdateProgressView> ();
			Container.RegisterType<IShellViewModel, ShellViewModel> ();
			Container.RegisterType<ShellView> ();
			return Container.Resolve<ShellView> ();
		}

		protected override void InitializeModules () {
			base.InitializeModules ();

			ThemeManager.ApplyTheme (Settings.Default.CurrentTheme);
			((ShellView) Shell).Show ();
		}

		#endregion

		#region Private Methods

		private void OnModuleLoaded (object sender, LoadModuleCompletedEventArgs e) {
			try {
				var type = Type.GetType (e.ModuleInfo.ModuleType);
				ThemeManager.CacheThemeInfo (type.Assembly);
			}
			catch {
				return;
			}
		}

		#endregion
	}
}
